package com.example.queue;

import java.util.Deque;
import java.util.LinkedList;

public class Leetcode225_MyStackByQueue {

    public static void main(String[] args) {
        MyStack stack = new MyStack();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        System.out.println(stack.top());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.top());


    }

    /**
     * 入栈操作时，首先获得入栈前的元素个数 n，然后将元素入队到队列，
     * 再将队列中的前 n个元素（即除了新入栈的元素之外的全部元素）依次出队并入队到队列，
     * 此时队列的前端的元素即为新入栈的元素，且队列的前端和后端分别对应栈顶和栈底。
     * <p>
     * 由于每次入栈操作都确保队列的前端元素为栈顶元素，因此出栈操作和获得栈顶元素操作都可以简单实现。
     * 出栈操作只需要移除队列的前端元素并返回即可，获得栈顶元素操作只需要获得队列的前端元素并返回即可（不移除元素）。
     * 由于队列用于存储栈内的元素，判断栈是否为空时，只需要判断队列是否为空即可。
     */
    private static class MyStack {
        private Deque<Integer> queue = new LinkedList<>();

        public MyStack() {
        }

        public void push(int x) {
            queue.add(x);
            for(int i = 0;i < queue.size() - 1;i++) {
                queue.offer(queue.poll());
            }

        }

        public int pop() {
            return queue.poll();
        }

        public int top() {
            return queue.peek();
        }

        public boolean empty() {
            return queue.isEmpty();
        }
    }
}
